package com.iboxpay.limit;

import com.google.common.util.concurrent.RateLimiter;

/**
 * 令牌桶原理
 * The class SmoothBurstyDemmo.
 *
 * Description: 
 *
 * @author: wangyanhui
 * @since: 2016年11月28日	
 * @version: $Revision$ $Date$ $LastChangedBy$
 *
 */
public class SmoothBurstyDemmo {

	public static void main(String[] args) throws Exception {
		/**
		 * 1、RateLimiter.create(5) 表示桶容量为5且每秒新增5个令牌，即每隔200毫秒新增一个令牌；
		 * 2、limiter.acquire()表示消费一个令牌，如果当前桶中有足够令牌则成功（返回值为0），如果桶中没有令牌则暂停一段时间，比如发令牌间隔是200毫秒，则等待200毫秒后再去消费令牌
	     * （如上测试用例返回的为0.198239，差不多等待了200毫秒桶中才有令牌可用），这种实现将突发请求速率平均为了固定请求速率。
		 */
//		RateLimiter l = RateLimiter.create(5);
//		System.out.println(l.acquire());
//		System.out.println(l.acquire());
//		System.out.println(l.acquire());
//		System.out.println(l.acquire());
//		System.out.println(l.acquire());
//		System.out.println(l.acquire());
		
		
		/**
		 * limiter.acquire(5)表示桶的容量为5且每秒新增5个令牌，令牌桶算法允许一定程度的突发，
		 * 所以可以一次性消费5个令牌，但接下来的limiter.acquire(1)将等待差不多1秒桶中才能有令牌，
		 * 且接下来的请求也整形为固定速率了。
		 */
//		RateLimiter l = RateLimiter.create(5);
//		System.out.println(l.acquire(5));
//		System.out.println(l.tryAcquire(1,100, TimeUnit.MILLISECONDS));
//		System.out.println(l.acquire(1));
		
		RateLimiter limiter = RateLimiter.create(2);
		System.out.println(limiter.acquire());
		Thread.sleep(2000L);
		System.out.println(limiter.acquire());
		System.out.println(limiter.acquire());
		System.out.println(limiter.acquire());
		System.out.println(limiter.acquire());
		System.out.println(limiter.acquire());
		
	}
}

	